wc -l
ファイルの各行の末尾に出力を追加しようとしています。 1つのファイルに20個のレコード/行がある場合は、そのファイルの各行の末尾に数字20を追加し、次のファイルに100個のレコード/行がある場合は、各行の末尾に100を追加したいと思います。次のコマンドを試しましたが、必要に応じて実行されませんでした。
awk -v char=$(wc -l FILENAME | cut -f1 -d' ') '{print $0"," char}' FILENAME
答え1
これは奇妙な要求ですが、好きなように機能します。
#!/bin/bash
shopt -s nullglob
for f in *.csv; do
size="$(wc -l <$f)"
sed -i "s/$/,$size/g" "$f"
done
exit
これにより、.csv
現在のディレクトリ内のすべてのファイルが内部で編集されます。
編集:Macではバックアップ拡張が必要なので、sed
コマンドが必要な場合があります。sed -i '.bak' "s/$/, $size/g" "$f"
しかし、これは私のLinuxシステムでは機能しません。
答え2
純粋なawkソリューション:
awk '
# Read the file and print it with the additional column
function process_file( SIZE, FILE, NEW_FILE ) {
NEW_FILE = FILE ".tmp"
while ( ( getline < FILE ) > 0 ){
print $0 "," SIZE > NEW_FILE
}
close( FILE )
close( NEW_FILE )
system( "mv -f " NEW_FILE " " FILE )
}
# File name has changed, we just passed the end of a file,
# => print the current file
( NR > 1 ) && ( PREV_FILE != FILENAME ) {
process_file( OLD_FNR, PREV_FILE )
}
{
# Save the current file name and line number within the file
PREV_FILE = FILENAME
OLD_FNR = FNR
}
END {
# Print the last file, if any
if ( PREV_FILE != "" ) {
process_file( OLD_FNR, PREV_FILE )
}
}' file1 file2 ...
これはより簡単です愚かな、その一つファイルの終わり健康状態:
gawk '
# Read the file and print it with the additional column
function process_file( SIZE, FILE, NEW_FILE ){
NEW_FILE = FILE ".tmp"
while ( ( getline < FILE ) > 0 ){
print $0 "," SIZE > NEW_FILE
}
close( FILE )
close( NEW_FILE )
system( "mv -f " NEW_FILE " " FILE )
}
# End of a file, print the file
# FILENAME is the name of the current file being read
# FNR is the line number within the file
ENDFILE {
process_file( FNR, FILENAME )
}' file1 file2 ...
答え3
それはawkではありませんが、単に動作します。
number=$(wc -l $1 | cut -d ' ' -f 1)
sed -i "s/\$/ ${number}/" $1
または1行に入力したい場合:
sed -i "s/\$/ $(wc -l $file | cut -d ' ' -f 1)/" $file
例:
user@server 22:59:58:/tmp$ file='FILENAME'
user@server 23:00:07:/tmp$ for ((i=0; i < 10; i++)) ; do echo 123 >> "$file"; done
user@server 23:00:18:/tmp$ cat "$file"
123
123
123
123
123
123
123
123
123
123
user@server 23:00:25:/tmp$ wc -l "$file"
10 FILENAME
user@server 23:00:30:/tmp$ sed -i "s/\$/ $(wc -l "$file" | cut -d ' ' -f 1)/" "$file"
user@server 23:00:37:/tmp$ cat "$file"
123 10
123 10
123 10
123 10
123 10
123 10
123 10
123 10
123 10
123 10
user@server 23:00:39:/tmp$
user@server 23:01:54:/tmp$ ls -lA "$file"
-rw-r--r-- 1 user user 70 Dez 4 23:00 FILENAME