여러 파일 이름이 포함된 목록이 있습니다.
file1
file2
다음과 같이 각 파일의 첫 번째 줄 끝에 파일 이름을 추가하고 싶습니다.
파일 1의 첫 번째 줄은 다음과 같습니다.
> ATCGCCfile1
파일 2의 첫 번째 줄은 다음과 같습니다.
> ATTTCCfile2
내 현재 아이디어는 파일 이름으로 변수 a를 만드는 것입니다.
a="file1 file2"
파일을 반복하고 색인을 불러오는 단어를 추가합니다.
for i in $a; do cat $i | awk '{print $0"$i"}' > $i.extended_word.txt; done
그러나 출력에서는 awk '{print $0"$i"}'
작동하지 않습니다. 첫 번째 file 의 경우처럼 파일 이름 없이 $i만 제공됩니다 >ATCGCC$i
.
내가 뭘 잘못했나요? 나는 또한 awk '{print $0"${i}"}'
성공하지 못한 채 괄호( )를 시도했습니다.
답변1
목록을 저장하려면 배열이 필요합니다.
a=(
file1
file2
'other file with spaces'
$'even with\nnewlines'
)
awk -- '
FNR == 1 {
close(out)
$0 = $0 FILENAME
out = FILENAME".extended_word.txt"
}
{print > out}' "${a[@]}"
파일 이름에 문자가 포함된 경우 나머지가 유효한 변수가 아닌지 =
확인해야 합니다 . 예를 들어 파일이 있으면 .=
awk
file=1
./file=1
GNU의 경우 awk
해결 방법은 다음과 같이 작성하는 것입니다.
gawk -e '
FNR == 1 {$0 = $0 FILENAME}
{print > FILENAME ".extended_word.txt"}
' -E /dev/null "${a[@]}"
이는 경로에 .이 있는 파일에도 작동 =
하지만 불행히도 이름이 -
.
답변2
모든 파일이 동일한 디렉토리에 있고 목록이 하나의 파일에 있다고 가정합니다.
파일.txt
file1
file2
사용 mapfile
및 sed
:
mapfile -t files < files.txt
for f in "${files[@]}"; do
if [ ! -f "$f" ]; then
echo "File '$f' does not exists."
continue
fi
sed "1s;.*;&$f;" "$f"
# With option '-i' the file will be written
# sed -i "1s;.*;&$f;" "$f"
done